package done.easy_101_200;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * 155. Mini Stack 最小栈
 * 设计一个支持 push，pop，top 操作，并能在常数时间内检索到最小元素的栈。
 * <p>
 * push(x) -- 将元素 x 推入栈中。
 * pop() -- 删除栈顶的元素。
 * top() -- 获取栈顶元素。
 * getMin() -- 检索栈中的最小元素。
 * <p>
 * 示例:
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.getMin();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.getMin();   --> 返回 -2.
 * <p>
 * 这道最小栈跟原来的栈相比就是多了一个功能，可以返回该栈的最小值。
 * 使用两个栈来实现，一个栈来按顺序存储push进来的数据，另一个用
 * 来存出现过的最小值。
 * 2019-03-24 6:48 PM
 **/
@Slf4j
public class MinStack {

    @SuppressWarnings("all")
    public void push(int x) {
        //190324 first
    }

    @SuppressWarnings("all")
    public void pop() {
        //190324 first
    }

    @SuppressWarnings("all")
    public int top() {
        //190324 first
        return -1;
    }

    @SuppressWarnings("all")
    public int getMin() {
        //190324 first
        return -1;
    }

    @Test
    public void test() {
        MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        log.info("getMin():{}", minStack.getMin());   //--> 返回 -3.
        minStack.pop();
        log.info("top():{}", minStack.top());         //--> 返回 0.
        log.info("getMin():{}", minStack.getMin());   //--> 返回 -2
    }
}






























/*
    // s1 正常的栈
    private Stack<Integer> s1 = new Stack<>();

    // s2 专门用来记 最小值，以及更小的值
    // 1) 在出栈的时候跟着一起出，
    // 2) 在入栈的时候大的不入栈，小的入栈
    private Stack<Integer> s2 = new Stack<>();

    public MinStack() {

    }

    @SuppressWarnings("all")
    public void push(int x) {
        s1.push(x);

        // 比我小我就要
        if (s2.isEmpty() || s2.peek() >= x) {
            s2.push(x);
        }
    }

    @SuppressWarnings("all")
    public void pop() {
        int x = s1.pop();

        // 对上了就删除
        if (s2.peek() == x) s2.pop();
    }

    @SuppressWarnings("all")
    public int top() {
        return s1.peek();
    }

    @SuppressWarnings("all")
    public int getMin() {
        return s2.peek();
    }
*/
